{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e655fd60",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== Running experiment with 10.0% edge drop ===\n",
      "Computing shortest paths for 11944 nodes...\n",
      "Shortest path computation took 756.86 seconds\n",
      "Average entropy for 10.0% drop: 4.3195\n",
      "\n",
      "=== Running experiment with 20.0% edge drop ===\n",
      "Computing shortest paths for 11944 nodes...\n",
      "Shortest path computation took 682.87 seconds\n",
      "Average entropy for 20.0% drop: 4.3119\n",
      "\n",
      "=== Running experiment with 30.0% edge drop ===\n",
      "Computing shortest paths for 11944 nodes...\n",
      "Shortest path computation took 595.07 seconds\n",
      "Average entropy for 30.0% drop: 4.3149\n",
      "\n",
      "=== Running experiment with 40.0% edge drop ===\n",
      "Computing shortest paths for 11944 nodes...\n",
      "Shortest path computation took 527.94 seconds\n",
      "Average entropy for 40.0% drop: 4.3029\n",
      "\n",
      "=== Running experiment with 50.0% edge drop ===\n",
      "Computing shortest paths for 11944 nodes...\n",
      "Shortest path computation took 439.70 seconds\n",
      "Average entropy for 50.0% drop: 4.2984\n",
      "\n",
      "=== Running experiment with 60.0% edge drop ===\n",
      "Computing shortest paths for 11944 nodes...\n",
      "Shortest path computation took 365.44 seconds\n",
      "Average entropy for 60.0% drop: 4.2825\n",
      "\n",
      "=== Running experiment with 70.0% edge drop ===\n",
      "Computing shortest paths for 11944 nodes...\n",
      "Shortest path computation took 287.56 seconds\n",
      "Average entropy for 70.0% drop: 4.2674\n",
      "\n",
      "=== Running experiment with 80.0% edge drop ===\n",
      "Computing shortest paths for 11944 nodes...\n",
      "Shortest path computation took 201.24 seconds\n",
      "Average entropy for 80.0% drop: 4.2161\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_2412999/3044689175.py:183: MatplotlibDeprecationWarning: The 'labels' parameter of boxplot() has been renamed 'tick_labels' since Matplotlib 3.9; support for the old name will be dropped in 3.11.\n",
      "  plt.boxplot(box_data, labels=labels, patch_artist=True)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAMWCAYAAAAgRDUeAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAwghJREFUeJzs3Xl4VOX5xvF7FgIhQNCwGBwgIagoBFxQQQrBSmsVlBjTzVqrVlvFWo3BtFB/FagrSUBFMe5rtQuOtEZrrSAxsiipiEZRMRAwgqwlIASGmTm/P9KZMmQ7b7bJ8v1cF5fmnZPkOTn3nJk8Oed9HZZlWQIAAAAAAABakTPaBQAAAAAAAKDzoSkFAAAAAACAVkdTCgAAAAAAAK2OphQAAAAAAABaHU0pAAAAAAAAtDqaUgAAAAAAAGh1NKUAAAAAAADQ6mhKAQAAAAAAoNXRlAIAAAAAAECroykFAGg1Tz/9tBwOR53/li1bZvw1V6xYoVmzZmnPnj3NXm9rOfrn0q1bNx133HE699xzdffdd2v79u01PmfWrFlyOBxG3+fAgQOaNWuW8c+5tu+VlJSkKVOmGH2dhrzwwgu67777an3M4XBo1qxZzfr9mtOWLVs0a9YsffDBB7a2X7ZsWcQxj4mJUd++fTVu3Dj97ne/06ZNm2p8Tign5eXlEeO33XabBg0aJLfbrd69e0uSfD6frrvuOiUmJsrlcunUU09t2g62INPncCiPdf07+udztPLycjkcDj399NNNrt3U0bV3795dHo9H559/vhYsWKB9+/a1ek0NCf28Qv+cTqeOOeYYnXfeeXrjjTca/XXb8/MdANB83NEuAADQ+Tz11FMaNmxYjfFTTjnF+GutWLFCs2fP1pVXXhn+hby9Cv1cDh8+rO3bt+udd97Rvffeq7y8PP35z3/WpEmTwttec801+t73vmf09Q8cOKDZs2dLkiZOnGj78xrzvRrjhRdeUGlpqW6++eYaj61cuVIej6fFa2isLVu2aPbs2UpKSjJqAN11110699xzFQgEtGvXLr377rt68sknNX/+fD322GP6yU9+Et528uTJWrlypRITE8Njf/vb33TnnXfqd7/7nS644AJ17dpVkvTwww/rkUce0YIFC3TGGWeoR48ezbavza2xz+HXX39d8fHxNcaP/Pm0VaHafT6ftmzZoiVLlignJ0e5ubl65ZVXNGrUqGiXWMONN96oyy67TIFAQJ9++qlmz56tCy+8UEuXLtWECROMv157fr4DAJoPTSkAQKsbMWKERo8eHZXvXVVVpdjY2Kh874Yc/XO59NJLlZWVpW9961vKyMjQ+vXr1b9/f0mSx+Np8V/aDhw4EL6SI9q/II4ZMyaq37+lnHDCCRH7dvHFFys7O1uTJk3SlVdeqZEjRyo1NVWS1LdvX/Xt2zfi80tLSyVJv/71r9WvX7+I8djYWP3qV79qtlpDeWgrzjjjDPXp0yfaZTTK0bX/6Ec/0q9+9SulpaXp4osv1ueffx5uMNYmGsdi0KBB4ayOGzdOJ5xwgtLS0vTEE080qilVn476fAcA1MTtewCANsnhcOhXv/qVnnvuOZ188snq3r27Ro0apcLCwvA2s2bN0q233ipJSk5OrnEbYOgWM6/Xq9NOO03dunULXylUWlqqqVOn6phjjlG3bt106qmn6plnnomoIXSL1fPPP69bbrlFxx13nGJjY5WWlqY1a9aEt3vuuefkcDi0cuXKGvsxZ84cdenSRVu2bGnUz2HQoEHKz8/Xvn379Mgjj0Ts+9G31C1dulQTJ05UQkKCYmNjNWjQIF166aU6cOCAysvLww2N2bNnh39WV155ZcTXe//995WZmaljjjlGKSkpdX6vkJdfflkjR45Ut27dNGTIED3wwAMRj9d1y1noZxs6VhMnTtSrr76qTZs2RdwqFFLb7Twmx/DFF1/U7373Ow0YMEC9evXSpEmT9Nlnn9X9g/+vL774QldddZVOOOEEde/eXccff7wuuugiffTRRxHf48wzz5QkXXXVVeHaG3v70bHHHqtHHnlEfr9f8+fPD48f/bNMSkrSbbfdJknq379/+Hs6HA49/vjjqqqqCtcSulXNsiwtXLhQp556qmJjY3XMMccoMzNTGzZsiKhh4sSJGjFihN5++22dc8456t69u66++mpJ0t69ezV9+nQlJycrJiZGxx9/vG6++Wbt378/4ms0x3O4qbZs2aIf/OAH6tmzp+Lj4/XDH/5QX3/9da3bPvbYYzrxxBPVtWtXnXLKKXrhhRd05ZVXKikpKWI7n8+nO+64Q8OGDVPXrl3Vt29fXXXVVdqxY0eTah01apR+97vfafPmzfrzn/8cHq/vWGzevFmXX365+vXrp65du+rkk09Wfn6+gsFg+PNDt9/NnTtXd955pwYNGqRu3bpp9OjRWrJkSaPrDTXQt23bFjH+0EMPacKECerXr5/i4uKUmpqquXPn6vDhwxH71BLP92AwqDvuuEMnnXSSYmNj1bt3b40cOVL3339/o/cTANCyuFIKANDqAoGA/H5/xJjD4ZDL5YoYe/XVV7V69WrNmTNHPXr00Ny5c3XJJZfos88+05AhQ3TNNddo9+7dWrBggbxeb/i2nSNvA3z//fe1bt063XbbbUpOTlZcXJw+++wznXPOOerXr58eeOABJSQk6Pnnn9eVV16pbdu2KScnJ6KOmTNn6vTTT9fjjz+uyspKzZo1SxMnTtSaNWs0ZMgQ/fCHP1ROTo4eeughjR07Nvx5fr9fjzzyiC655BINGDCg0T+vCy+8UC6XS2+//Xad25SXl2vy5MkaP368nnzySfXu3VtfffWVXn/9dfl8PiUmJur111/X9773Pf385z/XNddcI0k1rrzJyMjQj370I1133XU1mgxH++CDD3TzzTdr1qxZOu644/THP/5RN910k3w+n6ZPn260jwsXLtQvfvELlZWV6eWXX25w+8Ycw3Hjxunxxx/X3r179Zvf/EYXXXSR1q1bVyN3R9qyZYsSEhJ0zz33qG/fvtq9e7eeeeYZnX322VqzZo1OOukknX766Xrqqad01VVX6bbbbtPkyZMlqUlXl5155plKTEys95i//PLLeuihh/TEE0+EbwfzeDz63ve+pz/84Q966623tHTpUkkKNxh/+ctf6umnn9avf/1r3Xvvvdq9e7fmzJmjc845R2vXrg1fiSdJW7du1eWXX66cnBzdddddcjqdOnDggNLS0lRRUaGZM2dq5MiR+vjjj/X73/9eH330kd58882I5kJzPIfr0tB5pKqqSpMmTdKWLVt0991368QTT9Srr76qH/7whzW+1qOPPqpf/vKXuvTSSzV//nxVVlZq9uzZOnToUMR2wWBQU6dOVXFxsXJycnTOOedo06ZNuv322zVx4kSVlJQ06UrMiy++WDk5OXr77bd1xRVXhMdrOxY7duzQOeecI5/Ppz/84Q9KSkpSYWGhpk+frrKyMi1cuDDiaz/44IMaPHiw7rvvPgWDQc2dO1cXXHCBioqKIs5bdm3cuFGSdOKJJ0aMl5WV6bLLLgs3LdeuXas777xTn376qZ588klJLfd8nzt3rmbNmqXbbrtNEyZM0OHDh/Xpp5+26zkHAaDDswAAaCVPPfWUJanWfy6XK2JbSVb//v2tvXv3hse+/vpry+l0WnfffXd4LDc315Jkbdy4scb3Gzx4sOVyuazPPvssYvxHP/qR1bVrV2vz5s0R4xdccIHVvXt3a8+ePZZlWdZbb71lSbJOP/10KxgMhrcrLy+3unTpYl1zzTXhsdtvv92KiYmxtm3bFh7785//bEmyioqKbP1cVq9eXec2/fv3t04++eSI73fky/iiRYssSdYHH3xQ59fYsWOHJcm6/fbbazwW+nq///3v63zsSIMHD7YcDkeN7/ed73zH6tWrl7V///6IfTv6+IR+tm+99VZ4bPLkydbgwYNrrf3ouk2P4YUXXhix3V/+8hdLkrVy5cpav19d/H6/5fP5rBNOOMHKysoKj69evdqSZD311FO2vk6orr/+9a91bnP22WdbsbGx4Y9r+1mGjs2OHTsiPvdnP/uZFRcXFzG2cuVKS5KVn58fMf7ll19asbGxVk5OTngsLS3NkmQtWbIkYtu7777bcjqdNbIayt9rr70WHmuO53BtQvtc27+UlJTwdg8//LAlyfrb3/4W8fnXXnttxLEKBALWcccdZ5199tkR223atMnq0qVLRCZffPFFS5L10ksvRWwbOv4LFy60VfvRxyukqqrKkmRdcMEF4bG6jsVvf/tbS5L17rvvRoxff/31lsPhCJ/3Nm7caEmyBgwYYFVVVYW327t3r3XsscdakyZNqrfm0Offe++91uHDh62DBw9aH3zwgTV27FgrMTGx3uMWCASsw4cPW88++6zlcrms3bt3hx9rief7lClTrFNPPbXe/QEAtC3cvgcAaHXPPvusVq9eHfHv3XffrbHdueeeq549e4Y/7t+/v/r161frymR1GTlyZI2/5C9dulTnnXeeBg4cGDF+5ZVX6sCBAzVuw7vssssirv4YPHiwzjnnHL311lvhseuvv15S9S1AIQ8++KBSU1ObZb4Vy7LqffzUU09VTEyMfvGLX+iZZ56pcTuWXZdeeqntbYcPH15jQubLLrtMe/fu1fvvv9+o72+X6TG8+OKLIz4eOXKkJDWYJb/fr7vuukunnHKKYmJi5Ha7FRMTo/Xr12vdunXNsCd1a+iYmyosLJTD4dDll18uv98f/nfcccdp1KhRNW6ZO+aYY/Ttb3+7xtcYMWKETj311Iivcf7559d6211zPIfr8uabb9Y4jyxevDj8+FtvvaWePXvWOPaXXXZZxMefffaZvv76a/3gBz+IGB80aJDGjRsXMVZYWKjevXvroosuitj/U089Vccdd1yTbzus65jXdiyWLl2qU045RWeddVbE+JVXXinLssJXyYVkZGSoW7du4Y979uypiy66SG+//bYCgUCDtf3mN79Rly5dwrfOlZaW6pVXXqlxe+OaNWt08cUXKyEhQS6XS126dNEVV1yhQCCgzz//vMHvUxu7z/ezzjpLa9eu1bRp0/TPf/5Te/fubdT3AwC0Hm7fAwC0upNPPtnWROcJCQk1xrp27aqqqirb36u2lbh27dpV63joFrtdu3ZFjB933HE1tj3uuOO0du3a8Mf9+/fXD3/4Qz3yyCP67W9/q48//ljFxcUR80A11v79+7Vr167whNe1SUlJ0Ztvvqm5c+fqhhtu0P79+zVkyBD9+te/1k033WT7e5msXFbXz0Wq+TNsbqbH8OgshSaRbihLt9xyix566CH95je/UVpamo455hg5nU5dc801RjlsjM2bNzfpts+jbdu2TZZlRdyid6QhQ4ZEfFzbz3fbtm364osv1KVLl1q/xs6dOyM+bo7ncF1GjRpV70Tnu3btqnVfj85tKCu1bdu/f//wbWpS9f7v2bNHMTExtX7Po/ffVKhZd/Rxr+s8dnRD6MjPtXse8/l8+uabb2pdyfBIN910ky6//HIdOnRIq1at0m233aapU6dq7dq14eO8efNmjR8/XieddJLuv/9+JSUlqVu3bnrvvfd0ww03NPq4232+z5gxQ3FxcXr++edVUFAgl8ulCRMm6N57743a4hoAgPrRlAIAdGi1TdCdkJCgrVu31hgPTUZ+9C+6tU2M/PXXX9f4hfumm27Sc889p7/97W96/fXX1bt3b/3kJz9pSvmSquflCQQCmjhxYr3bjR8/XuPHj1cgEFBJSYkWLFigm2++Wf3799ePfvQjW9+rrgnNa1PXz0X6XzMidGXG0XPzNPWXd9Nj2FjPP/+8rrjiCt11110R4zt37lTv3r2b5XvU5r333tPXX3+tn//85832Nfv06SOHw6Hi4uJaV3Y7eqy2LPTp00exsbHhuYFqe7ytSEhI0HvvvVdj/OjchrJ69ITdtW3bp08fJSQk6PXXX6/1ex55VVhj/P3vf5ekGs/1ljyPxcTEqEePHg3W5vF4wo2dcePG6bjjjtPll1+u22+/XQ8++KAkafHixdq/f7+8Xq8GDx4c/twPPvigwa9fH7v76na7dcstt+iWW27Rnj179Oabb2rmzJk6//zz9eWXX7ap1SMBANW4fQ8A0K7ZveLlSOedd56WLl1aY0W8Z599Vt27d6+xHPmLL74YcVvNpk2btGLFihq/OJ5xxhk655xzdO+99+qPf/yjrrzySsXFxRnuUaTNmzdr+vTpio+P1y9/+Utbn+NyuXT22WfroYcekqTwrXSN+VnV5+OPP464WkySXnjhBfXs2VOnn366JIWv5Pjwww8jtgv98n0kkytoTI9hYzkcjhrNmldffVVfffVVxFhz/mx3796t6667Tl26dFFWVlaTv17IlClTZFmWvvrqK40ePbrGv/quxDvya5SVlSkhIaHWr1HblTsNae5chpx77rnat29fjay98MILER+fdNJJOu644/SXv/wlYnzz5s1asWJFxNiUKVO0a9cuBQKBWvf/pJNOanS9a9eu1V133aWkpKQatxLW5rzzztMnn3xS41bZZ599Vg6HQ+eee27EuNfr1cGDB8Mf79u3T6+88orGjx9f72T/dfnJT36iiRMn6rHHHgtf4RVqnh35nLEsK+K25pCWfr737t1bmZmZuuGGG7R79+4aK4ACANoGrpQCALS60tLSGqtmSdW3oB29GlxDQr9I33///frZz36mLl266KSTTqr3ioXbb79dhYWFOvfcc/X73/9exx57rP74xz/q1Vdf1dy5c2vcxrJ9+3Zdcskluvbaa1VZWanbb79d3bp104wZM2p87Ztuukk//OEP5XA4NG3aNKN9Cf1c/H6/tm/fruLiYj311FNyuVx6+eWX6/3ZFBQUaOnSpZo8ebIGDRqkgwcPhq9mmTRpkqTqqzgGDx6sv/3tbzrvvPN07LHHqk+fPo1qJEjVt85cfPHFmjVrlhITE/X888/rX//6l+69997wFQlnnnmmTjrpJE2fPl1+v1/HHHOMXn75Zb3zzjs1vl5qaqq8Xq8efvhhnXHGGXI6nXXecmN6DBtrypQpevrppzVs2DCNHDlS//73v5Wbm1tjZb2UlBTFxsbqj3/8o04++WT16NFDAwYMaPD2u/Xr12vVqlUKBoPatWuX3n33XT3xxBPau3evnn32WQ0fPrxZ9kOqvrrlF7/4ha666iqVlJRowoQJiouL09atW/XOO+8oNTU1PDdaXW6++Wa99NJLmjBhgrKysjRy5EgFg0Ft3rxZb7zxhrKzs3X22Wcb1dWY57Ak/fvf/671OJ9yyinq1auXrrjiCs2fP19XXHGF7rzzTp1wwgl67bXX9M9//jNie6fTqdmzZ+uXv/ylMjMzdfXVV2vPnj2aPXu2EhMT5XT+72+4P/rRj/THP/5RF154oW666SadddZZ6tKliyoqKvTWW29p6tSpuuSSSxrc51Dthw8f1pYtW7RkyRI999xz6tevn1555ZU6bw88UlZWlp599llNnjxZc+bM0eDBg/Xqq69q4cKFuv7662vMpedyufSd73xHt9xyi4LBoO69917t3btXs2fPbvB71eXee+/V2WefrT/84Q96/PHH9Z3vfEcxMTH68Y9/rJycHB08eFAPP/yw/vOf/9T43JZ4vl900UUaMWKERo8erb59+2rTpk267777NHjwYJ1wwgmN3k8AQAuK3hzrAIDOpr7V9yRZjz32WHhbSdYNN9xQ42sMHjzY+tnPfhYxNmPGDGvAgAGW0+mMWNFt8ODB1uTJk2ut5aOPPrIuuugiKz4+3oqJibFGjRpVY+W00Appzz33nPXrX//a6tu3r9W1a1dr/PjxVklJSa1f99ChQ1bXrl2t733ve43+ucTExFj9+vWz0tLSrLvuusvavn17jc85ekW8lStXWpdccok1ePBgq2vXrlZCQoKVlpZm/f3vf4/4vDfffNM67bTTrK5du1qSwj/L+lYFq2v1vcmTJ1uLFi2yhg8fbsXExFhJSUnWvHnzanz+559/bn33u9+1evXqZfXt29e68cYbrVdffbXG6nu7d++2MjMzrd69e1sOhyPie6qWVQNNjuHRq9yFVhRraLW8//znP9bPf/5zq1+/flb37t2tb33rW1ZxcbGVlpZmpaWlRWz74osvWsOGDbO6dOlS5yqHR9cV+ud2u62EhARr7Nix1syZM63y8vIan9PU1fdCnnzySevss8+24uLirNjYWCslJcW64oorIjKdlpZmDR8+vNbP/+abb6zbbrvNOumkk6yYmBgrPj7eSk1NtbKysqyvv/46vF1zPIdrU9/qe5Ksf/3rX+FtKyoqrEsvvdTq0aOH1bNnT+vSSy+1VqxYUeuxf/TRR62hQ4daMTEx1oknnmg9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XmLT6m50DgAAAAAAgMTjnVIAAAAAAACIO4ZSAAAAAAAAiDuGUgAAAAAAAIg7hlJJ6I033tCNN96o7t27y+fzacmSJVGPO+f06KOPqnv37kpLS9Po0aP17rvvRj1nypQp6ty5s3r27KmXXnop6rH//d//1Y033niut4E4mTlzpoYOHaoOHTooKytL48aN0/bt26OeQzOoNXv2bA0aNEgdO3ZUx44dNWzYMP3tb3+LPE4raMjMmTPl8/l03333Ra7RC2o9+uij8vl8UT+6desWeZxWcLp9+/bplltuUZcuXXTeeefpsssu08aNGyOP0wxq9e7du87XF5/Pp0mTJkmiFUQLBoP6wQ9+oD59+igtLU25ubn60Y9+pHA4HHkOzTQxh6Tz17/+1T388MNu4cKFTpJbvHhx1OOzZs1yHTp0cAsXLnRbt251X/nKV1x2drY7cuSIc865pUuXuq5du7oNGza4P/7xj65du3bu0KFDzjnn/v3vf7u+ffu6f/3rX/HeFs6Rq6++2s2dO9cVFxe7zZs3u+uvv9717NnTHTt2LPIcmkGtpUuXuldeecVt377dbd++3T300EOuTZs2rri42DlHK6jfO++843r37u0GDRrk7r333sh1ekGtRx55xF166aWurKws8qO8vDzyOK3gVB9//LHr1auXmzhxonv77bfd7t273YoVK9x7770XeQ7NoFZ5eXnU15bly5c7SW7lypXOOVpBtB//+MeuS5cubtmyZW737t3uT3/6k2vfvr37xS9+EXkOzTQthlJJ7vShVDgcdt26dXOzZs2KXPvkk09cRkaGmzNnjnPOuZ/85CfuK1/5SuTxrKws98477zjnnLvjjjvcz3/+8/gsHglRXl7uJLnVq1c752gGjTv//PPdb3/7W1pBvY4ePeouuugit3z5cjdq1KjIUIpecKpHHnnEDR48uN7HaAWnmzZtmhsxYkSDj9MMzuTee+91F154oQuHw7SCOq6//np3++23R10bP368u+WWW5xzfH05F/j2vVZm9+7dOnDggMaOHRu51rZtW40aNUpvvvmmJGnw4MEqKCjQv//9b23cuFGVlZXq27ev1q5dq02bNumee+5J1PIRBxUVFZKkzp07S6IZNCwUCumll17S8ePHNWzYMFpBvSZNmqTrr79eX/jCF6Ku0wtOt3PnTnXv3l19+vTRV7/6VZWWlkqiFdS1dOlS5efn68tf/rKysrJ0+eWX6/nnn488TjNoSHV1tRYsWKDbb79dPp+PVlDHiBEj9I9//EM7duyQJBUVFWnt2rW67rrrJPH15VxgKNXKHDhwQJLUtWvXqOtdu3aNPHb11Vfrlltu0dChQzVx4kT9z//8j9LT03XXXXfpN7/5jWbPnq1+/fpp+PDhdb53Fi2bc05TpkzRiBEjNGDAAEk0g7q2bt2q9u3bq23btrrzzju1ePFi9e/fn1ZQx0svvaRNmzZp5syZdR6jF5zqs5/9rObPn69XX31Vzz//vA4cOKDPf/7z+uijj2gFdZSWlmr27Nm66KKL9Oqrr+rOO+/UPffco/nz50vi6wsatmTJEh0+fFgTJ06URCuoa9q0abr55puVl5enNm3a6PLLL9d9992nm2++WRLNnBOJfqsWzi2d9u1769atc5Lc/v37o573rW99y1199dUN/jqPPPKIu++++1xRUZHr2rWrKy8vd7///e/dpz/96XO1dCTAd7/7XderVy/3wQcfRK7RDE5XVVXldu7c6TZs2OAefPBB96lPfcq9++67tIIoe/bscVlZWW7z5s2Ra6d++x694EyOHTvmunbt6p566ilaQR1t2rRxw4YNi7o2efJk97nPfc45x9cXNGzs2LHuhhtuiPycVnC6F1980eXk5LgXX3zRbdmyxc2fP9917tzZzZs3zzlHM+cC75RqZWpPsqmd4tYqLy+vM+2ttW3bNr3wwgt67LHHtGrVKo0cOVKZmZm66aabtGnTJh05cuScrxvn3uTJk7V06VKtXLlSOTk5kes0g9Olpqaqb9++ys/P18yZMzV48GA9/fTTtIIoGzduVHl5uYYMGaKUlBSlpKRo9erV+uUvf6mUlJRIE/SC+qSnp2vgwIHauXMnX1tQR3Z2tvr37x917ZJLLtGePXsk8W8X1O9f//qXVqxYoW9961uRa7SC0z3wwAN68MEH9dWvflUDBw7Urbfeqvvvvz/yrm+aaXoMpVqZPn36qFu3blq+fHnkWnV1tVavXq3Pf/7zdZ7vnNO3v/1tPfXUU2rfvr1CoZBOnjwpSZH/e+rxmGh5nHO6++67tWjRIr3++uvq06dP1OM0g8Y451RVVUUriDJmzBht3bpVmzdvjvzIz8/X17/+dW3evFm5ubn0ggZVVVWppKRE2dnZfG1BHcOHD9f27dujru3YsUO9evWSxL9dUL+5c+cqKytL119/feQareB0J06ckN8fPSYJBAKR15VmzoFEvUUL587Ro0ddYWGhKywsdJLcz3/+c1dYWBg5dnLWrFkuIyPDLVq0yG3dutXdfPPNUUdYnuo3v/mN+9KXvhT5+dtvv+06duzo3nrrLffDH/7Q9e/fP277wrlx1113uYyMDLdq1aqo43JPnDgReQ7NoNb06dPdG2+84Xbv3u22bNniHnroIef3+91rr73mnKMVnNmp377nHL3g/3zve99zq1atcqWlpW79+vXuhhtucB06dHDvv/++c45WEO2dd95xKSkp7vHHH3c7d+50L7zwgjvvvPPcggULIs+hGZwqFAq5nj17umnTptV5jFZwqttuu81dcMEFbtmyZW737t1u0aJF7lOf+pSbOnVq5Dk007QYSiWhlStXOkl1ftx2223OuZpjLB955BHXrVs317ZtWzdy5Ei3devWOr/OgQMHXK9evdy+ffuirs+YMcN17tzZ5eXlubfffjseW8I5VF8rktzcuXMjz6EZ1Lr99ttdr169XGpqqsvMzHRjxoyJDKScoxWc2elDKXpBra985SsuOzvbtWnTxnXv3t2NHz/evfvuu5HHaQWn+8tf/uIGDBjg2rZt6/Ly8txzzz0X9TjN4FSvvvqqk+S2b99e5zFawamOHDni7r33XtezZ0/Xrl07l5ub6x5++GFXVVUVeQ7NNC2fc84l5C1aAAAAAAAAaLW4pxQAAAAAAADijqEUAAAAAAAA4o6hFAAAAAAAAOKOoRQAAAAAAADijqEUAAAAAAAA4o6hFAAAAAAAAOKOoRQAAAAAAADijqEUAAAAAAAA4o6hFAAAaNV8Pp+WLFmS6GUkpdGjR+u+++5L9DIAAEAzxVAKAAAkhYkTJ8rn89X5cc011yR6aVq1alVkPX6/XxkZGbr88ss1depUlZWVNYt1+Xw+denSRVdddZXWrVt3Vr/O4cOHo64vWrRIjz32WBOuGAAAJBOGUgAAIGlcc801Kisri/rx4osvJnpZEdu3b9f+/fu1YcMGTZs2TStWrNCAAQO0devWBj+muro6LusqKyvTqlWrlJmZqeuvv17l5eUx/7qdO3dWhw4dmmCFAAAgGTGUAgAASaNt27bq1q1b1I/zzz8/8vjOnTs1cuRItWvXTv3799fy5cvr/BpvvvmmLrvsMrVr1075+flasmSJfD6fNm/eHHnOP//5T1133XVq3769unbtqltvvVWHDh1qdH1ZWVnq1q2bLr74Yn31q1/VunXrlJmZqbvuuivynIkTJ2rcuHGaOXOmunfvrosvvliStHXrVl111VVKS0tTly5d9O1vf1vHjh2r83EzZsxQVlaWOnbsqO985zuehlq16xo4cKB+8IMfqKKiQm+//Xbk8QULFig/P18dOnRQt27d9LWvfS0ytHr//fd15ZVXSpLOP/98+Xw+TZw4UVLdb9/797//rW984xs6//zzdd555+naa6/Vzp07G10fAABITgylAABAqxAOhzV+/HgFAgGtX79ec+bM0bRp06Kec/ToUd14440aOHCgNm3apMcee6zOc8rKyjRq1ChddtllKigo0N///nd9+OGHuummm8xrSktL05133ql169ZFvTPpH//4h0pKSrR8+XItW7ZMJ06c0DXXXKPzzz9fGzZs0J/+9CetWLFCd999d9SvV/txK1eu1IsvvqjFixdrxowZntdz4sQJzZ07V5LUpk2byPXq6mo99thjKioq0pIlS7R79+7I4KlHjx5auHChpP97x9XTTz9d768/ceJEFRQUaOnSpXrrrbfknNN1112nkydPel4jAABIHimJXgAAAEBTWbZsmdq3bx91bdq0afqv//ovrVixQiUlJXr//feVk5MjSXriiSd07bXXRp77wgsvyOfz6fnnn4+8m2rfvn264447Is+ZPXu2Pv3pT+uJJ56IXPv973+vHj16aMeOHZF3NnmVl5cnqeYdR1lZWZKk9PR0/fa3v1Vqaqok6fnnn1dlZaXmz5+v9PR0SdKzzz6rG2+8UT/5yU/UtWtXSVJqaqp+//vf67zzztOll16qH/3oR3rggQf02GOPye9v+L9F1v55nDhxQs45DRkyRGPGjIk8fvvtt0f+d25urn75y1/qM5/5jI4dO6b27durc+fOkmrecdWpU6d6f4+dO3dq6dKlWrdunT7/+c9Lqvnz7tGjh5YsWaIvf/nLpj83AADQ8jGUAgAASePKK6/U7Nmzo67VDkxKSkrUs2fPyABGkoYNGxb13O3bt2vQoEFq165d5NpnPvOZqOds3LhRK1eurDP8kqRdu3aZh1LOOUk1pwDWGjhwYGQgVbv2wYMHRwZSkjR8+HCFw2Ft3749MpQaPHiwzjvvvKj9HTt2TB988IF69erV4BrWrFmj9PR0FRYWatq0aZo3b17UO6UKCwv16KOPavPmzfr4448VDoclSXv27FH//v097bOkpEQpKSn67Gc/G7nWpUsX9evXTyUlJZ5+DQAAkFwYSgEAgKSRnp6uvn371vtY7fDnVKcOgmqfU9+1U4XD4cg7lE6XnZ1tXXJkINO7d+/ItVOHTw2tq1ZD1y3P6dOnjzp16qSLL75Yn3zyif7jP/5DxcXFatu2rY4fP66xY8dq7NixWrBggTIzM7Vnzx5dffXVppuw1/fnX3vdyx4AAEDy4Z5SAACgVejfv7/27Nmj/fv3R6699dZbUc/Jy8vTli1bVFVVFblWUFAQ9ZxPf/rTevfdd9W7d2/17ds36sfpw6TGVFZW6rnnntPIkSOVmZl5xrVv3rxZx48fj1xbt26d/H5/1DuzioqKVFlZGfn5+vXr1b59+6h3hzXm1ltvVTgc1q9//WtJ0rZt23To0CHNmjVLV1xxhfLy8uqczFf7rq5QKHTGPQSDwagbqH/00UfasWOHLrnkEs/rAwAAyYOhFAAASBpVVVU6cOBA1I/aU/G+8IUvqF+/fvrGN76hoqIirVmzRg8//HDUx3/ta19TOBzWt7/9bZWUlOjVV1/Vk08+Ken/3m00adIkffzxx7r55pv1zjvvqLS0VK+99ppuv/32Mw5lJKm8vFwHDhzQzp079dJLL2n48OE6dOhQnW85PN3Xv/51tWvXTrfddpuKi4u1cuVKTZ48WbfeemvkW/ekmhuS/+d//qf++c9/6m9/+5seeeQR3X333We8n9Tp/H6/7rvvPs2aNUsnTpxQz549lZqaqmeeeUalpaVaunSpHnvssaiP6dWrl3w+n5YtW6aDBw9GnQpY66KLLtIXv/hF3XHHHVq7dq2Kiop0yy236IILLtAXv/hFz+sDAADJg6EUAABIGn//+9+VnZ0d9WPEiBGSaoYtixcvVlVVlT7zmc/oW9/6lh5//PGoj+/YsaP+8pe/aPPmzbrsssv08MMP64c//KEkRe4z1b17d61bt06hUEhXX321BgwYoHvvvVcZGRmNDn/69eun7t27a8iQIZo1a5a+8IUvqLi4uNH7Mp133nl69dVX9fHHH2vo0KGaMGGCxowZo2effTbqeWPGjNFFF12kkSNH6qabbtKNN96oRx991PJHKKnmxuYnT57Us88+q8zMTM2bN09/+tOf1L9/f82aNSsyqKt1wQUXaMaMGXrwwQfVtWvXOqcC1po7d66GDBmiG264QcOGDZNzTn/961+j7l8FAABaD59r6Bv8AQAAoBdeeEHf/OY3VVFRobS0tEQvp0ETJ07U4cOHtWTJkkQvBQAAwBNudA4AAHCK+fPnKzc3VxdccIGKioo0bdo03XTTTc16IAUAANASMZQCAAA4xYEDB/TDH/5QBw4cUHZ2tr785S/X+TY/AAAAxI5v3wMAAAAAAEDccaNzAAAAAAAAxB1DKQAAAAAAAMQdQykAAAAAAADEHUMpAAAAAAAAxB1DKQAAAAAAAMQdQykAAAAAAADEHUMpAAAAAAAAxB1DKQAAAAAAAMQdQykAAAAAAADE3f8DsceQcXM7EwUAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1200x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== Entropy Statistics Summary ===\n",
      "10% drop:\n",
      "  Mean: 4.3195\n",
      "  Min: 3.9069\n",
      "  Max: 4.3219\n",
      "  Std: 0.0297\n",
      "  25th percentile: 4.3219\n",
      "  50th percentile: 4.3219\n",
      "  75th percentile: 4.3219\n",
      "\n",
      "20% drop:\n",
      "  Mean: 4.3119\n",
      "  Min: 3.1699\n",
      "  Max: 4.3219\n",
      "  Std: 0.1013\n",
      "  25th percentile: 4.3219\n",
      "  50th percentile: 4.3219\n",
      "  75th percentile: 4.3219\n",
      "\n",
      "30% drop:\n",
      "  Mean: 4.3149\n",
      "  Min: 3.3219\n",
      "  Max: 4.3219\n",
      "  Std: 0.0762\n",
      "  25th percentile: 4.3219\n",
      "  50th percentile: 4.3219\n",
      "  75th percentile: 4.3219\n",
      "\n",
      "40% drop:\n",
      "  Mean: 4.3029\n",
      "  Min: 3.1699\n",
      "  Max: 4.3219\n",
      "  Std: 0.1209\n",
      "  25th percentile: 4.3219\n",
      "  50th percentile: 4.3219\n",
      "  75th percentile: 4.3219\n",
      "\n",
      "50% drop:\n",
      "  Mean: 4.2984\n",
      "  Min: 2.8074\n",
      "  Max: 4.3219\n",
      "  Std: 0.1451\n",
      "  25th percentile: 4.3219\n",
      "  50th percentile: 4.3219\n",
      "  75th percentile: 4.3219\n",
      "\n",
      "60% drop:\n",
      "  Mean: 4.2825\n",
      "  Min: 2.0000\n",
      "  Max: 4.3219\n",
      "  Std: 0.2244\n",
      "  25th percentile: 4.3219\n",
      "  50th percentile: 4.3219\n",
      "  75th percentile: 4.3219\n",
      "\n",
      "70% drop:\n",
      "  Mean: 4.2674\n",
      "  Min: 1.5850\n",
      "  Max: 4.3219\n",
      "  Std: 0.2546\n",
      "  25th percentile: 4.3219\n",
      "  50th percentile: 4.3219\n",
      "  75th percentile: 4.3219\n",
      "\n",
      "80% drop:\n",
      "  Mean: 4.2161\n",
      "  Min: 2.0000\n",
      "  Max: 4.3219\n",
      "  Std: 0.3636\n",
      "  25th percentile: 4.3219\n",
      "  50th percentile: 4.3219\n",
      "  75th percentile: 4.3219\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import scipy.sparse as sp\n",
    "from scipy.sparse.csgraph import shortest_path\n",
    "from scipy.io import loadmat\n",
    "import pickle\n",
    "import time\n",
    "import os\n",
    "import random as rd\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "import matplotlib.pyplot as plt\n",
    "from collections import defaultdict\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "\n",
    "# 1. 加载原始Amazon数据集\n",
    "def load_amazon_data(prefix=\"../../data/\"):\n",
    "    \"\"\"加载原始Amazon数据集\"\"\"\n",
    "    data_file = loadmat(os.path.join(prefix, 'Amazon.mat'))\n",
    "    labels = data_file['label'].flatten()\n",
    "    feat_data = data_file['features'].todense().A\n",
    "\n",
    "    # 加载原始边关系\n",
    "    with open(os.path.join(prefix, 'amz_upu_adjlists.pickle'), 'rb') as file:\n",
    "        upu_edges = pickle.load(file)\n",
    "    with open(os.path.join(prefix, 'amz_usu_adjlists.pickle'), 'rb') as file:\n",
    "        usu_edges = pickle.load(file)\n",
    "    with open(os.path.join(prefix, 'amz_uvu_adjlists.pickle'), 'rb') as file:\n",
    "        uvu_edges = pickle.load(file)\n",
    "\n",
    "    # 合并所有边关系\n",
    "    all_edges = defaultdict(set)\n",
    "    for edge_dict in [upu_edges, usu_edges, uvu_edges]:\n",
    "        for src, targets in edge_dict.items():\n",
    "            all_edges[src] |= set(targets)\n",
    "            for tgt in targets:\n",
    "                all_edges[tgt].add(src)  # 确保无向图\n",
    "\n",
    "    return feat_data, labels, all_edges\n",
    "\n",
    "\n",
    "# 2. 边随机丢弃函数\n",
    "def drop_edges(edge_dict, drop_ratio):\n",
    "    \"\"\"随机丢弃一定比例的边\"\"\"\n",
    "    dropped_edges = {}\n",
    "    all_edges = []\n",
    "\n",
    "    # 收集所有边\n",
    "    for src, targets in edge_dict.items():\n",
    "        for tgt in targets:\n",
    "            if src < tgt:  # 避免重复\n",
    "                all_edges.append((src, tgt))\n",
    "\n",
    "    # 随机丢弃\n",
    "    num_edges = len(all_edges)\n",
    "    num_drop = int(num_edges * drop_ratio)\n",
    "    edges_to_drop = set(rd.sample(all_edges, num_drop))\n",
    "\n",
    "    # 重建边字典\n",
    "    new_edge_dict = defaultdict(set)\n",
    "    for src, tgt in all_edges:\n",
    "        if (src, tgt) not in edges_to_drop and (tgt, src) not in edges_to_drop:\n",
    "            new_edge_dict[src].add(tgt)\n",
    "            new_edge_dict[tgt].add(src)\n",
    "\n",
    "    return new_edge_dict\n",
    "\n",
    "\n",
    "# 3. 重新计算最短距离矩阵\n",
    "def compute_shortest_path_matrix(edge_dict, num_nodes):\n",
    "    \"\"\"从边字典计算最短距离矩阵\"\"\"\n",
    "    # 创建邻接矩阵\n",
    "    adj_matrix = sp.lil_matrix((num_nodes, num_nodes), dtype=np.int8)\n",
    "\n",
    "    for src, targets in edge_dict.items():\n",
    "        for tgt in targets:\n",
    "            if src < num_nodes and tgt < num_nodes:  # 确保索引在范围内\n",
    "                adj_matrix[src, tgt] = 1\n",
    "                adj_matrix[tgt, src] = 1\n",
    "\n",
    "    # 转换为CSR格式\n",
    "    adj_matrix = adj_matrix.tocsr()\n",
    "\n",
    "    # 计算最短路径\n",
    "    print(f\"Computing shortest paths for {num_nodes} nodes...\")\n",
    "    start_time = time.time()\n",
    "\n",
    "    dist_matrix = shortest_path(adj_matrix,\n",
    "                                directed=False,\n",
    "                                unweighted=True,\n",
    "                                method='D')\n",
    "\n",
    "    print(f\"Shortest path computation took {time.time() - start_time:.2f} seconds\")\n",
    "\n",
    "    # 处理不可达节点\n",
    "    dist_matrix[np.isinf(dist_matrix)] = -1\n",
    "    return dist_matrix.astype(np.int32)\n",
    "\n",
    "\n",
    "# 4. BSNE相关函数 (简化版)\n",
    "def calculate_p_matrix(center_idx, neighbors, dist_matrix, device):\n",
    "    \"\"\"计算P矩阵\"\"\"\n",
    "    # 获取原始距离\n",
    "    orig_dists = dist_matrix[center_idx][neighbors]\n",
    "\n",
    "    # 计算P向量（基于节点路径距离）\n",
    "    P = (1.0 + orig_dists ** 2) ** -1\n",
    "    P_sum = P.sum()\n",
    "\n",
    "    # 避免除零错误\n",
    "    if P_sum < 1e-10:\n",
    "        P = np.ones_like(P) / len(P)\n",
    "    else:\n",
    "        P = P / P_sum\n",
    "\n",
    "    return P\n",
    "\n",
    "\n",
    "# 5. 计算熵值\n",
    "def calculate_entropy(P):\n",
    "    \"\"\"计算概率分布的熵\"\"\"\n",
    "    # 避免log(0)错误\n",
    "    P = np.clip(P, 1e-10, 1.0)\n",
    "    entropy = -np.sum(P * np.log2(P))\n",
    "    return entropy\n",
    "\n",
    "\n",
    "# 主实验函数\n",
    "def run_edge_drop_experiment(drop_ratios, num_centers=100, sample_size=20):\n",
    "    # 加载原始数据\n",
    "    feat_data, labels, all_edges = load_amazon_data()\n",
    "    num_nodes = len(feat_data)\n",
    "    results = {}\n",
    "\n",
    "    for ratio in drop_ratios:\n",
    "        print(f\"\\n=== Running experiment with {ratio * 100}% edge drop ===\")\n",
    "\n",
    "        # 丢弃边\n",
    "        dropped_edges = drop_edges(all_edges, ratio)\n",
    "\n",
    "        # 重新计算最短距离矩阵\n",
    "        dist_matrix = compute_shortest_path_matrix(dropped_edges, num_nodes)\n",
    "\n",
    "        # 随机选择中心节点\n",
    "        center_indices = rd.sample(range(num_nodes), num_centers)\n",
    "        entropies = []\n",
    "\n",
    "        for center_idx in center_indices:\n",
    "            # 获取中心节点的邻居\n",
    "            neighbors = list(dropped_edges.get(center_idx, set()))\n",
    "\n",
    "            # 如果邻居太多，进行采样\n",
    "            if len(neighbors) > sample_size:\n",
    "                neighbors = rd.sample(neighbors, sample_size)\n",
    "\n",
    "            # 计算P矩阵\n",
    "            P = calculate_p_matrix(center_idx, neighbors, dist_matrix, device='cpu')\n",
    "\n",
    "            # 计算熵值\n",
    "            entropy = calculate_entropy(P)\n",
    "            entropies.append(entropy)\n",
    "\n",
    "        results[ratio] = entropies\n",
    "        print(f\"Average entropy for {ratio * 100}% drop: {np.mean(entropies):.4f}\")\n",
    "\n",
    "    return results\n",
    "\n",
    "\n",
    "# 可视化结果\n",
    "def visualize_entropy_results(results, output_path=\"entropy_distribution.png\"):\n",
    "    plt.figure(figsize=(12, 8))\n",
    "\n",
    "    # 准备箱线图数据\n",
    "    box_data = []\n",
    "    labels = []\n",
    "    for ratio, entropies in results.items():\n",
    "        box_data.append(entropies)\n",
    "        labels.append(f\"{ratio * 100:.0f}%\")\n",
    "\n",
    "    # 绘制箱线图\n",
    "    plt.boxplot(box_data, labels=labels, patch_artist=True)\n",
    "\n",
    "    # 添加平均点\n",
    "    for i, ratio in enumerate(results.keys()):\n",
    "        mean_val = np.mean(results[ratio])\n",
    "        plt.scatter(i + 1, mean_val, color='red', zorder=3, label='Mean' if i == 0 else \"\")\n",
    "\n",
    "    plt.title(\"Entropy Distribution at Different Edge Drop Ratios\")\n",
    "    plt.xlabel(\"Edge Drop Ratio\")\n",
    "    plt.ylabel(\"Entropy of P Matrix\")\n",
    "    plt.grid(True, linestyle='--', alpha=0.7)\n",
    "    plt.legend()\n",
    "\n",
    "    plt.tight_layout()\n",
    "    plt.savefig(output_path, dpi=300)\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    # 实验参数\n",
    "    drop_ratios = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]\n",
    "    num_centers = 200  # 每个比例使用200个中心节点\n",
    "    sample_size = 20  # 每个中心节点采样20个邻居\n",
    "\n",
    "    # 运行实验\n",
    "    results = run_edge_drop_experiment(drop_ratios, num_centers, sample_size)\n",
    "\n",
    "    # 保存结果\n",
    "    with open(\"entropy_results.pkl\", \"wb\") as f:\n",
    "        pickle.dump(results, f)\n",
    "\n",
    "    # 可视化\n",
    "    visualize_entropy_results(results)\n",
    "\n",
    "    # 打印统计摘要\n",
    "    print(\"\\n=== Entropy Statistics Summary ===\")\n",
    "    for ratio, entropies in results.items():\n",
    "        print(f\"{ratio * 100:.0f}% drop:\")\n",
    "        print(f\"  Mean: {np.mean(entropies):.4f}\")\n",
    "        print(f\"  Min: {np.min(entropies):.4f}\")\n",
    "        print(f\"  Max: {np.max(entropies):.4f}\")\n",
    "        print(f\"  Std: {np.std(entropies):.4f}\")\n",
    "        print(f\"  25th percentile: {np.percentile(entropies, 25):.4f}\")\n",
    "        print(f\"  50th percentile: {np.percentile(entropies, 50):.4f}\")\n",
    "        print(f\"  75th percentile: {np.percentile(entropies, 75):.4f}\")\n",
    "        print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0208c234",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== Processing original graph (0% drop) ===\n",
      "Computing shortest paths for 11944 nodes...\n",
      "Shortest path computation took 4039.83 seconds\n",
      "Original graph entropy stats: mean=13.4845, min=13.3939, max=13.5282\n",
      "\n",
      "=== Running experiment with 10.0% edge drop ===\n",
      "Computing shortest paths for 11944 nodes...\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import scipy.sparse as sp\n",
    "from scipy.sparse.csgraph import shortest_path\n",
    "from scipy.io import loadmat\n",
    "import pickle\n",
    "import time\n",
    "import os\n",
    "import random as rd\n",
    "import torch\n",
    "import matplotlib.pyplot as plt\n",
    "from collections import defaultdict\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.model_selection import train_test_split\n",
    "import networkx as nx\n",
    "from scipy.stats import entropy\n",
    "\n",
    "# 1. 加载原始Amazon数据集\n",
    "def load_amazon_data(prefix=\"../../data/\"):\n",
    "    \"\"\"加载原始Amazon数据集\"\"\"\n",
    "    data_file = loadmat(os.path.join(prefix, 'Amazon.mat'))\n",
    "    labels = data_file['label'].flatten()\n",
    "    feat_data = data_file['features'].todense().A\n",
    "    \n",
    "    # 加载原始边关系\n",
    "    edge_dicts = {}\n",
    "    for rel in ['upu', 'usu', 'uvu']:\n",
    "        with open(os.path.join(prefix, f'amz_{rel}_adjlists.pickle'), 'rb') as file:\n",
    "            edge_dicts[rel] = pickle.load(file)\n",
    "    \n",
    "    return feat_data, labels, edge_dicts\n",
    "\n",
    "# 2. 边随机丢弃函数（保持关系类型）\n",
    "def drop_edges(edge_dicts, drop_ratio):\n",
    "    \"\"\"随机丢弃一定比例的边（保持关系类型）\"\"\"\n",
    "    new_edge_dicts = {}\n",
    "    \n",
    "    for rel, edge_dict in edge_dicts.items():\n",
    "        # 收集所有边\n",
    "        all_edges = []\n",
    "        for src, targets in edge_dict.items():\n",
    "            for tgt in targets:\n",
    "                all_edges.append((src, tgt))\n",
    "        \n",
    "        # 随机丢弃\n",
    "        num_edges = len(all_edges)\n",
    "        num_drop = int(num_edges * drop_ratio)\n",
    "        edges_to_drop = set(rd.sample(all_edges, num_drop))\n",
    "        \n",
    "        # 重建边字典\n",
    "        new_edge_dict = defaultdict(set)\n",
    "        for src, tgt in all_edges:\n",
    "            if (src, tgt) not in edges_to_drop:\n",
    "                new_edge_dict[src].add(tgt)\n",
    "        \n",
    "        new_edge_dicts[rel] = new_edge_dict\n",
    "    \n",
    "    return new_edge_dicts\n",
    "\n",
    "# 3. 重新计算最短距离矩阵（考虑关系类型）\n",
    "def compute_shortest_path_matrix(edge_dicts, num_nodes):\n",
    "    \"\"\"从边字典计算最短距离矩阵（考虑关系类型）\"\"\"\n",
    "    # 创建无向图（合并所有关系）\n",
    "    G = nx.Graph()\n",
    "    \n",
    "    # 添加所有节点\n",
    "    G.add_nodes_from(range(num_nodes))\n",
    "    \n",
    "    # 添加所有边（忽略关系类型）\n",
    "    for rel_dict in edge_dicts.values():\n",
    "        for src, targets in rel_dict.items():\n",
    "            for tgt in targets:\n",
    "                if src < num_nodes and tgt < num_nodes:  # 确保索引在范围内\n",
    "                    G.add_edge(src, tgt)\n",
    "    \n",
    "    # 计算最短路径\n",
    "    print(f\"Computing shortest paths for {num_nodes} nodes...\")\n",
    "    start_time = time.time()\n",
    "    \n",
    "    # 初始化距离矩阵\n",
    "    dist_matrix = np.full((num_nodes, num_nodes), np.inf)\n",
    "    np.fill_diagonal(dist_matrix, 0)\n",
    "    \n",
    "    # 计算连通组件内的最短路径\n",
    "    components = list(nx.connected_components(G))\n",
    "    for comp in components:\n",
    "        comp = list(comp)\n",
    "        subgraph = G.subgraph(comp)\n",
    "        comp_dist = nx.floyd_warshall_numpy(subgraph)\n",
    "        \n",
    "        # 将结果放入全局距离矩阵\n",
    "        comp_indices = np.array(comp)\n",
    "        dist_matrix[np.ix_(comp_indices, comp_indices)] = comp_dist\n",
    "    \n",
    "    # 处理不可达节点\n",
    "    dist_matrix[np.isinf(dist_matrix)] = -1\n",
    "    print(f\"Shortest path computation took {time.time()-start_time:.2f} seconds\")\n",
    "    \n",
    "    return dist_matrix.astype(np.int32)\n",
    "\n",
    "# 4. 计算P矩阵（每行）\n",
    "def calculate_p_matrix(dist_matrix, sample_size=20):\n",
    "    \"\"\"计算每个节点的P矩阵（每行）\"\"\"\n",
    "    num_nodes = dist_matrix.shape[0]\n",
    "    P_matrix = np.zeros((num_nodes, num_nodes))\n",
    "    \n",
    "    for i in range(num_nodes):\n",
    "        # 获取当前节点的距离向量\n",
    "        dist_vec = dist_matrix[i]\n",
    "        \n",
    "        # 排除自身和不可达节点\n",
    "        valid_indices = np.where((dist_vec > 0) & (dist_vec != -1))[0]\n",
    "        \n",
    "        if len(valid_indices) == 0:\n",
    "            # 没有有效邻居\n",
    "            P_matrix[i, i] = 1.0\n",
    "            continue\n",
    "            \n",
    "        # 计算概率分布\n",
    "        probs = (1.0 + dist_vec[valid_indices] ** 2) ** -1\n",
    "        probs_sum = probs.sum()\n",
    "        \n",
    "        if probs_sum < 1e-10:\n",
    "            # 如果所有概率都很小，则均匀分布\n",
    "            probs = np.ones_like(probs) / len(probs)\n",
    "        else:\n",
    "            probs = probs / probs_sum\n",
    "        \n",
    "        # 保存到P矩阵\n",
    "        P_matrix[i, valid_indices] = probs\n",
    "    \n",
    "    return P_matrix\n",
    "\n",
    "# 5. 计算每行的熵值\n",
    "def calculate_row_entropies(P_matrix):\n",
    "    \"\"\"计算P矩阵每行的熵值\"\"\"\n",
    "    entropies = []\n",
    "    num_nodes = P_matrix.shape[0]\n",
    "    \n",
    "    for i in range(num_nodes):\n",
    "        row = P_matrix[i]\n",
    "        \n",
    "        # 移除零概率元素\n",
    "        non_zero_indices = np.where(row > 0)[0]\n",
    "        if len(non_zero_indices) == 0:\n",
    "            # 如果没有非零概率，熵为0\n",
    "            entropies.append(0.0)\n",
    "            continue\n",
    "        \n",
    "        # 提取非零概率\n",
    "        probs = row[non_zero_indices]\n",
    "        \n",
    "        # 归一化（确保和为1）\n",
    "        probs = probs / probs.sum()\n",
    "        \n",
    "        # 计算熵\n",
    "        ent = entropy(probs, base=2)  # 使用以2为底的对数\n",
    "        entropies.append(ent)\n",
    "    \n",
    "    return np.array(entropies)\n",
    "\n",
    "# 主实验函数\n",
    "def run_edge_drop_experiment(drop_ratios, num_centers=200):\n",
    "    # 加载原始数据\n",
    "    feat_data, labels, edge_dicts = load_amazon_data()\n",
    "    num_nodes = len(feat_data)\n",
    "    results = {}\n",
    "    \n",
    "    # 原始图的P矩阵和熵\n",
    "    print(\"\\n=== Processing original graph (0% drop) ===\")\n",
    "    dist_matrix = compute_shortest_path_matrix(edge_dicts, num_nodes)\n",
    "    P_matrix = calculate_p_matrix(dist_matrix)\n",
    "    entropies = calculate_row_entropies(P_matrix)\n",
    "    results[0.0] = entropies\n",
    "    print(f\"Original graph entropy stats: mean={np.mean(entropies):.4f}, min={np.min(entropies):.4f}, max={np.max(entropies):.4f}\")\n",
    "    \n",
    "    # 不同丢弃比例\n",
    "    for ratio in drop_ratios:\n",
    "        print(f\"\\n=== Running experiment with {ratio*100}% edge drop ===\")\n",
    "        \n",
    "        # 丢弃边\n",
    "        dropped_edge_dicts = drop_edges(edge_dicts, ratio)\n",
    "        \n",
    "        # 重新计算最短距离矩阵\n",
    "        dist_matrix = compute_shortest_path_matrix(dropped_edge_dicts, num_nodes)\n",
    "        \n",
    "        # 计算P矩阵\n",
    "        P_matrix = calculate_p_matrix(dist_matrix)\n",
    "        \n",
    "        # 计算每行的熵值\n",
    "        entropies = calculate_row_entropies(P_matrix)\n",
    "        \n",
    "        # 保存结果\n",
    "        results[ratio] = entropies\n",
    "        print(f\"Entropy stats for {ratio*100}% drop: mean={np.mean(entropies):.4f}, min={np.min(entropies):.4f}, max={np.max(entropies):.4f}\")\n",
    "    \n",
    "    return results\n",
    "\n",
    "# 可视化结果\n",
    "def visualize_entropy_results(results, output_path=\"row_entropy_distribution.png\"):\n",
    "    plt.figure(figsize=(14, 8))\n",
    "    \n",
    "    # 准备箱线图数据\n",
    "    box_data = []\n",
    "    labels = []\n",
    "    ratios = sorted(results.keys())\n",
    "    \n",
    "    for ratio in ratios:\n",
    "        entropies = results[ratio]\n",
    "        box_data.append(entropies)\n",
    "        labels.append(f\"{ratio*100:.0f}%\" if ratio > 0 else \"0% (Original)\")\n",
    "    \n",
    "    # 绘制箱线图\n",
    "    boxplot = plt.boxplot(box_data, labels=labels, patch_artist=True, showmeans=True,\n",
    "                         meanprops={'marker':'o', 'markerfacecolor':'white', 'markeredgecolor':'red'})\n",
    "    \n",
    "    # 设置箱线图颜色\n",
    "    colors = ['lightblue', 'lightgreen', 'lightyellow', 'lightpink', 'lightcyan', 'lavender', 'wheat', 'bisque']\n",
    "    for patch, color in zip(boxplot['boxes'], colors):\n",
    "        patch.set_facecolor(color)\n",
    "    \n",
    "    plt.title(\"Entropy Distribution of P Matrix Rows at Different Edge Drop Ratios\", fontsize=14)\n",
    "    plt.xlabel(\"Edge Drop Ratio\", fontsize=12)\n",
    "    plt.ylabel(\"Entropy of P Matrix Row (bits)\", fontsize=12)\n",
    "    plt.grid(True, linestyle='--', alpha=0.7)\n",
    "    \n",
    "    # 添加均值标签\n",
    "    for i, ratio in enumerate(ratios):\n",
    "        mean_val = np.mean(results[ratio])\n",
    "        plt.text(i+1.1, mean_val+0.05, f'{mean_val:.3f}', fontsize=9, ha='center')\n",
    "    \n",
    "    plt.xticks(rotation=15)\n",
    "    plt.tight_layout()\n",
    "    plt.savefig(output_path, dpi=300)\n",
    "    plt.show()\n",
    "    \n",
    "    # 绘制熵值分布直方图\n",
    "    plt.figure(figsize=(14, 10))\n",
    "    for i, ratio in enumerate(ratios):\n",
    "        plt.subplot(3, 3, i+1)\n",
    "        entropies = results[ratio]\n",
    "        plt.hist(entropies, bins=30, color=colors[i], alpha=0.8)\n",
    "        plt.title(f\"{ratio*100:.0f}% Edge Drop\" if ratio > 0 else \"Original Graph\")\n",
    "        plt.xlabel(\"Entropy (bits)\")\n",
    "        plt.ylabel(\"Frequency\")\n",
    "        plt.grid(True, linestyle='--', alpha=0.3)\n",
    "        plt.axvline(np.mean(entropies), color='red', linestyle='dashed', linewidth=1)\n",
    "        plt.text(np.mean(entropies)*1.1, plt.ylim()[1]*0.8, f'Mean: {np.mean(entropies):.3f}', color='red')\n",
    "    \n",
    "    plt.tight_layout()\n",
    "    plt.savefig(\"entropy_histograms.png\", dpi=300)\n",
    "    plt.show()\n",
    "\n",
    "# 运行实验\n",
    "if __name__ == \"__main__\":\n",
    "    # 实验参数\n",
    "    drop_ratios = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7]\n",
    "    \n",
    "    # 运行实验\n",
    "    results = run_edge_drop_experiment(drop_ratios)\n",
    "    \n",
    "    # 保存结果\n",
    "    with open(\"p_matrix_entropy_results.pkl\", \"wb\") as f:\n",
    "        pickle.dump(results, f)\n",
    "    \n",
    "    # 可视化\n",
    "    visualize_entropy_results(results)\n",
    "    \n",
    "    # 打印统计摘要\n",
    "    print(\"\\n=== P Matrix Row Entropy Statistics Summary ===\")\n",
    "    for ratio, entropies in sorted(results.items()):\n",
    "        print(f\"{ratio*100:.0f}% drop:\" if ratio > 0 else \"Original graph:\")\n",
    "        print(f\"  Mean: {np.mean(entropies):.4f}\")\n",
    "        print(f\"  Min: {np.min(entropies):.4f}\")\n",
    "        print(f\"  Max: {np.max(entropies):.4f}\")\n",
    "        print(f\"  Std: {np.std(entropies):.4f}\")\n",
    "        print(f\"  25th percentile: {np.percentile(entropies, 25):.4f}\")\n",
    "        print(f\"  50th percentile: {np.percentile(entropies, 50):.4f}\")\n",
    "        print(f\"  75th percentile: {np.percentile(entropies, 75):.4f}\")\n",
    "        print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7110fd38",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "tsne01",
   "language": "python",
   "name": "tsne01"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
